package com.yeti.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.yeti.domain.Cliente;
import com.yeti.domain.Lista;

@Repository(value = "listaDao")
public class ListaDAOImpl implements ListaDAO {

	private static final long serialVersionUID = -2113618745189446381L;
	private EntityManager em = null;

    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.em = em;
    }
    
	/**
	 * Metodo que actualiza la informacion de una lista de la base de datos.
	 * 
	 * @param l: Es la lista a actualizar.
	 * @return devuelve true si la operacion se produce correctamente o false en caso contrario.
	 */
	@Override
	public boolean updateLista(Lista l) {
    	try{
    		em.merge(l);
    	}catch(Exception e){
    		System.out.println(e);
    		return false;
    	}
    	return true;
	}

	/**
	 * Metodo que agrega una lista en la base de datos.
	 * 
	 * @param l: Es la lista a agregar.
	 * @return devuelve true si la operacion se produce correctamente o false en caso contrario.
	 */
	@Override
	public boolean addLista(Lista l) {
		try{
			em.persist(l);
			return true;
		}catch(Exception e){
			System.out.println(e);
			return false;
		}
	}

	/**
	 * Metodo que elimina a una lista de la base de datos.
	 * 
	 * @param l: Es la lista a eliminar.
	 * @return devuelve true si la operacion se produce correctamente o false en caso contrario.
	 */
	@Override
	public boolean remLista(Lista l) {
		try{
//			em.remove(l);
			em.createQuery("delete from Lista where id="+l.getId()).executeUpdate();
		}catch(Exception e){
			System.out.println(e);
			return false;
		}
		return true;
	}
	

	/**
	 * Metodo que busca una lista por id.
	 * 
	 * @param id: es el id de la lista.
	 * @return devuelve la lista si la encuentra o null en caso contrario.
	 */
	@Override
	public Lista getLista(int id) {
		try{
			return (Lista)em.find(Lista.class, id);
		}catch(Exception e){
			System.out.println(e);
			return null;
		}
	}
	
	/**
	 * Metodo que devuelve todas las listas de un usuario.
	 * 
	 * @param username: Es el nombre de usuario por el que se buscaran las listas.
	 * @return devuelve al cliente si lo encuentra o null en caso contrario.
	 */
	@Override
	public List<Lista> getListas(String username) {
		try{
			Query query=em.createQuery("select l from Lista l,User u where l.id=u.id and u.username=:username");
			query.setParameter("username", username);
			return (List<Lista>)query.getResultList();
		}catch(Exception e){
			System.out.println(e);
			return null;
		}
	}

}
